package com.ccn.ui.a2screenadaptation;

import android.app.Activity;
import android.app.Application;
import android.content.ComponentCallbacks;
import android.content.res.Configuration;
import android.util.DisplayMetrics;

import androidx.annotation.NonNull;

/**
 * 屏幕适配-像素密度
 * 详见：pixel_density.png
 * 修改density（指屏幕密度，一般来说，屏幕上每一寸有160个像素点，如果某屏幕每一寸有320个像素点，那么density值就为2，density = dpi / 160），
 * scaleDensity（字体缩放比例，默认density），
 * densityDpi（像素密度，指每一寸屏幕有多少像素点，如上述160、320等），
 * px = dp * density
 * 直接更改系统内部对于目标尺寸而言的像素密度
 */
public class A2_1_3PixelDensity {

    private static final float WIDTH = 320;//参考设备的宽，单位是dp

    //屏幕密度
    private static float appDensity;
    //字体缩放比例，默认appDensity
    private static float appScaleDensity;

    public static void setDensity(Application application, Activity activity) {
        //获取当前app的屏幕显示信息
        DisplayMetrics metrics = application.getResources().getDisplayMetrics();
        if (appDensity == 0) {
            //初始化复制操作
            appDensity = metrics.density;
            appScaleDensity = metrics.scaledDensity;

            //添加字体变化监听回调
            application.registerComponentCallbacks(new ComponentCallbacks() {
                @Override
                public void onConfigurationChanged(@NonNull Configuration newConfig) {
                    /*
                    在屏幕密度被修改的情况下，也使系统修改字体大小生效
                    举个栗子：
                    appDensity变大，系统修改字体变大，字体相当于变大两次
                    如果不修改appScaleDensity，那么字体相当于变大一次
                     */
                    //字体发生更改，重新对scaleDensity进行赋值
                    if (/*@NonNull表示不为空 newConfig != null && */newConfig.fontScale > 0) {
                        /*
                        * 经过测试，手机修改字体大小以后，应用会重新启动
                        * appScaleDensity的值会更改，
                        * setDensity方法重新执行，
                        * 由于appDensity ！= 0，
                        * 所以appScaleDensity的值不会被设置为初始值
                        * */
                        appScaleDensity = application.getResources().getDisplayMetrics().scaledDensity;
                    }
                }

                @Override
                public void onLowMemory() {

                }
            });
        }

        //计算出目标值的density,scaleDensity,densityDpi
        //density = px/dp
        float targetDensity = metrics.widthPixels / WIDTH;
        float targetScaleDensity = targetDensity * (appScaleDensity / appDensity);
        int targetDensityDpi = (int) (targetDensity * 160);

        //替换Activity的density，scaleDensity，densityDpi
        DisplayMetrics dm = activity.getResources().getDisplayMetrics();
        dm.density = targetDensity;
        dm.scaledDensity = targetScaleDensity;
        dm.densityDpi = targetDensityDpi;
    }

}
